
package com.catsic.zcjc.service.impl;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.apache.commons.collections.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;

import com.catsic.base.BaseServiceImpl;
import com.catsic.base.exception.CatsicException;
import com.catsic.core.exception.CatsicExceptionCode;
import com.catsic.zcjc.condition.EquipDataCondition;
import com.catsic.zcjc.constants.ZcjcConstants;
import com.catsic.zcjc.convert.ZcjcConverts;
import com.catsic.zcjc.dao.EquipDataDao;
import com.catsic.zcjc.dao.jdbc.JdbcEquipDataDao;
import com.catsic.zcjc.entity.EquipData;
import com.catsic.zcjc.entity.EquipFileData;
import com.catsic.zcjc.entity.Station;
import com.catsic.zcjc.form.EquipDataForm;
import com.catsic.zcjc.form.StationCountForm;
import com.catsic.zcjc.service.EquipDataService;
import com.catsic.zcjc.service.EquipFileDataService;
import com.catsic.zcjc.specifiction.EquipDataSpec;


@Service("equipDataService")
public class EquipDataServiceImpl extends BaseServiceImpl<EquipData, String> implements EquipDataService{
	
	/**
	 * EquipDataDao:设备Dao
	 */
	@Autowired
	private EquipDataDao equipDataDao;
	
	@Autowired
	private JdbcEquipDataDao jdbcEquipDataDao;
	
	@Autowired
	private EquipFileDataService equipFileDataService;
	
	@Override
	public EquipData findById(String id){
		EquipData EquipData = getById(id);
		if(null == EquipData){
			throw new CatsicException(CatsicExceptionCode.实体不存在, ZcjcConstants.EQUIP);
		}
		return EquipData;
	}
	

	@Override
	public EquipDataForm findEquipDataById(String id){
		EquipData EquipData = findById(id);
		return ZcjcConverts.convert(EquipData);
	}
	
	
	public Page<EquipDataForm> findAll(EquipDataCondition condition, Pageable pageable){
		EquipDataSpec spec = new EquipDataSpec(condition);
		Page<EquipData> page = equipDataDao.findAll(spec, pageable);
		List<EquipDataForm> listForm = new ArrayList<EquipDataForm>();
		for(EquipData equipData :page.getContent()){
			EquipDataForm form = ZcjcConverts.convert(equipData);
			
			
			listForm.add(form);
	    }
	    Page<EquipDataForm> page_ = new PageImpl<EquipDataForm>(listForm,pageable,page.getTotalElements());
	    return page_;
	}




	@Override
	public List<EquipData> findByStationId(String stationId) {
		return equipDataDao.findByStationId(stationId);
	}


	@Override
	public List<EquipDataForm> queryByStationId(String stationId) {
		List<EquipData> list = this.findByStationId(stationId);
		
		List<EquipDataForm> listForm = new ArrayList<EquipDataForm>();
		
		if(CollectionUtils.isNotEmpty(listForm)){
			for(EquipData equip :list){
				listForm.add(ZcjcConverts.convert(equip));
		    }
		}
		
		return listForm;
	}


	@Override
	public List<EquipDataForm> queryByEquipId(String equipId) {
		List<EquipData> list = this.findByEquipId(equipId);
		
		List<EquipDataForm> listForm = new ArrayList<EquipDataForm>();
		
		if(CollectionUtils.isNotEmpty(listForm)){
			for(EquipData equip :list){
				listForm.add(ZcjcConverts.convert(equip));
		    }
		}
		
		return listForm;
	}


	@Override
	public List<EquipData> findByEquipId(String equipId) {
		return equipDataDao.findByEquipId(equipId);
	}


	@Override
	public int count(EquipDataCondition condition) {
		EquipDataSpec spec = new EquipDataSpec(condition);
		Long count = equipDataDao.count(spec);

		return count.intValue();
	}
	
	public EquipDataForm findNowData(EquipDataCondition condition){
		EquipDataForm form = new EquipDataForm();

		Station station = new Station();
		station.setId(condition.getStationId());
		
		EquipData data = equipDataDao.findFirstByStationOrderByCollectionTimeDesc(station.getId());
		if(data!=null){
			int count = this.count(condition);
			form = ZcjcConverts.convert(data);
			
			form.setTrainCount(count);
			
			EquipFileData headPic = equipFileDataService.findByDataIdAndType(data.getId(), ZcjcConstants.DATA_FILE_HEAD_PIC);
			form.setHeadPic(headPic);
		}
		return form;
	}


	@Override
	public List<StationCountForm> findByCount(String type, EquipDataCondition condition) {
		List<StationCountForm> list = new ArrayList<StationCountForm>();
		
		List<Map<String,Object>> dataList = jdbcEquipDataDao.getByCount(type,condition);
		if(CollectionUtils.isNotEmpty(dataList)){
			for(Map<String,Object> map : dataList){
				list.add(ZcjcConverts.convert(type,map));
			}
		}
		
		return list;
	}
}
